package com.pilates.diario;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;


import com.pilates.Matricula 
import com.pilates.Presenca 
import com.pilates.Aula 
import com.pilates.comparator.AlunoComparator;
import com.pilates.comparator.AulaPresencaComparator;
import com.pilates.types.TypePresenca;

public class DiarioUtil {
	
	def criaDiario = { turmaId, data ->
		
		List<Matricula> lMatricula = Matricula.findAll("from Matricula mat" +
		" inner join fetch mat.turma tur " +
		" inner join fetch tur.aulas aul " +
		" inner join fetch mat.pessoa pes " +
		" where " +
		" mat.ativo = 'SIM' and" +
		" mat.experimental = false and" +
		" tur.id = ? and " +
		" year(aul.data) = ? and" +
		" month(aul.data) = ? " +
		" order by " +
		" pes.nome, aul.data ",[Long.valueOf(turmaId), data.getYear(), data.getMonth()+1 ]);
		
		
		List<Presenca> lPresenca = Presenca.findAll("from Presenca pres" +
		" inner join fetch pres.matricula mat " +
		" inner join fetch pres.aula aul" +
		" where " +
		" mat.turma.id = aul.turma.id and" +
		" mat.turma.id = ? and" +
		" year(aul.data) = ? and" +
		" month(aul.data) = ? ",[Long.valueOf(turmaId), data.getYear(), data.getMonth()+1]);
		
		
		Map<String, Presenca> mapPresencas = new HashMap<String, Presenca>();
		
		for (Presenca presenca : lPresenca) {
			mapPresencas.put(presenca.getMatricula().getId()+""+presenca.getAula().getId(), presenca);
		}
		
		
		List<Aluno> alunos = new ArrayList<Aluno>()
		Map<Long, Aluno> mapAlunos = new HashMap<Long, Aluno>()
		Presenca presenca = null;
		
		Map<Long, Set<Long>> mapAlunoAula = new HashMap<Long, HashSet<Long>>()
		for (Matricula matricula : lMatricula) {
			Long pessoaId = matricula.getPessoa().getId();
			Aluno aluno = mapAlunos.get(pessoaId);
			if(aluno == null){
				String pessoaNome = matricula.getPessoa().getNome();
				aluno = new Aluno();
				aluno.setPessoaId(pessoaId);
				aluno.setPessoaNome(pessoaNome);
				aluno.setMatriculaId(matricula.getId())
				mapAlunos.put(pessoaId, aluno)
				alunos.add(aluno)
			}
			
			
			for (Aula aula : matricula.getTurma().getAulas()) {
				AulaPresenca aulaPresenca = new AulaPresenca();
				Set<Long> sAulas = mapAlunoAula.get(pessoaId);
				if(sAulas == null){
					sAulas = new HashSet<Long>();
					mapAlunoAula.put(pessoaId, sAulas);
				}
				if(!sAulas.contains(aula.getId())){
					sAulas.add(aula.getId())
					
					aulaPresenca.setAulaId(aula.getId());
					aulaPresenca.setDia(aula.getData().getDate());
					
					presenca = mapPresencas.get(matricula.getId()+""+aula.getId());
					
					if(matricula.getDataInicio() == null){
						Calendar cal = Calendar.getInstance();
						cal.add(Calendar.MONTH, -3);
						matricula.setDataInicio(cal.getTime());
						matricula.save();
					}
					
					
					if(aula.getData().compareTo(matricula.getDataInicio()) >= 0){
						if(presenca == null){
							presenca = new Presenca()
							presenca.setAula(aula);
							presenca.setMatricula(matricula);
							presenca.setPresenca(TypePresenca.PRESENTE);
							presenca.save()
						}
						
						aulaPresenca.setPresencaId( presenca.getId() );
						aulaPresenca.setPresenca( presenca.getPresenca() );
					}else{
						aulaPresenca.setPresencaId( -1 );
						aulaPresenca.setPresenca( TypePresenca.COMPLEMENTO );
					}
					
					aluno.getAulas().add(aulaPresenca);
				}
			}
		}
		
		for (Aluno aluno : alunos) {
			int faltas = 0;
			for (AulaPresenca aula : aluno.getAulas()) {
				if(aula.getPresenca() != TypePresenca.PRESENTE){
					faltas++;
				}
			}
			aluno.setFaltaMes(faltas);
			aluno.setFaltaTotal(faltas);
		}
		
		
		//ordena os alunos
		Collections.sort( alunos, new AlunoComparator());
		//ordena as aulas
		for (Aluno aluno : alunos) {
			Collections.sort( aluno.getAulas(), new AulaPresencaComparator());
		}
		
		return alunos;
	}
}
